from flask import request
from flask import jsonify,g
from authen.token import jwt_decode_token
import time
from apps.user.models import UserModel

#无须验证token的路由
IGNORE_TOKEN_URL={'/user/login/':['POST']}

#响应前使用的中间件【跨域】
def after_request(resp):
    # 给响应对象添加上
    #允许所有源来访问
    resp.headers['Access-Control-Allow-Origin'] = '*'
    #设置跨域访问的请求方式
    resp.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,OPTIONS,DELETE,PATCH'
    #设置跨域访问可以使用的请求头信息
    resp.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type,token'
    return resp

#请求前使用的中间件【认证中间件】
def before_request():
    method = request.method
    path = request.path
    if path in IGNORE_TOKEN_URL:
        #在这个路由当中的,且请求方式是要求的，就无须进行token认证
        if method in IGNORE_TOKEN_URL.get(path):
            return
    #需要进行token认证
    token = request.cookies.get('token')
    if not token:
        token = request.headers.get('token')
    if not token:
        return jsonify({'code':410,'msg':'没有携带token'}),403
    try:
        payload = jwt_decode_token(token)
    except Exception as e:
        return jsonify({'code': 410, 'error': 'token有问题'}),403
    user_id = payload.get('user_id')
    exp = payload.get('exp')
    now = time.time()
    obj = UserModel.query.filter_by(id=user_id).first()
    if not obj:
        return jsonify({'code': 410, 'error': 'token有问题'}),403
    if exp < now:
        return jsonify({'code': 410, 'error': 'token已经过期了'}),403
    #把当前登录对象和token信息赋值给当前请求对象
    request.user = obj
    request.auth = token
    g.user = obj
